"use strict"

import {app, ipcMain, globalShortcut, protocol, BrowserWindow, Menu} from "electron"
import {createProtocol} from "vue-cli-plugin-electron-builder/lib"

// 定义：是否作为开发环境。
const isDevelopment = process.env.NODE_ENV !== "production"

// 处理：协议 schema 必须在应用准备前注册。
protocol.registerSchemesAsPrivileged([
    {
        // 协议。
        scheme: "app",
        // 权限。
        privileges: {
            secure: true, // 安全协议。
            standard: true, // 标准协议。
        }
    }
]);

// 处理：禁用菜单栏。
// 说明：如果是在创建窗口时使用 autoHideMenuBar:false，则只会隐藏，但按下Alt键时会再次唤起。
Menu.setApplicationMenu(null);

// 处理：创建浏览器窗口。
async function createWindow() {
    // 处理：实例化浏览器窗口，主要用于加载应用程序。
    const mainWindow = new BrowserWindow({
        width: 300, // 宽度，如果不设置，则默认为 800。
        height: 400, // 高度，如果不设置，则默认为 600。
        maximizable: false, // 是否允许最大化，如果不设置，则默认为 true。
        resizable: false, // 是否允许缩放，如果不设置，则默认为 true。
        hasShadow: true, // 是否显示阴影，仅适用于 macOS。
        titleBarStyle: "hidden", // 标题栏样式，可选值：hidden、hiddenInset、customButtonsOnHover。
        title: "微信", // 标题，如果不设置，则默认为 package.json 中的 productName。
        frame: true, // 是否显示边框。
        autoHideMenuBar: true, // 是否自动隐藏菜单栏。
        backgroundColor: "#FFFFFF", // 背景颜色，如果不设置，则默认为白色。
        show: true, // 是否显示，如果不设置，则默认为 true。
        // 网页首选项。
        webPreferences: {
            nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION, // 是否启用 Node.js 集成，默认为 true，如果设置为 false，则不能在页面中使用 Node.js API。
            contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION, // 是否启用上下文隔离，默认为 false，如果设置为 true，则必须在 preload 脚本中使用全局变量 contextBridge 来桥接 Electron API。
        }
    })

    // 校验：如果是开发模式，则加载URL。
    if (process.env.WEBPACK_DEV_SERVER_URL) {
        await mainWindow.loadURL(process.env.WEBPACK_DEV_SERVER_URL.concat("#/login"));
    }
    // 否则：使用自定义协议的Schema。
    else {
        createProtocol("app")
        await mainWindow.loadURL("app://./index.html#/login")
    }

    ipcMain.on("login-success", async () => {
        // 校验：如果是开发模式，则加载URL。
        if (process.env.WEBPACK_DEV_SERVER_URL) {
            await mainWindow.loadURL(process.env.WEBPACK_DEV_SERVER_URL);
        }
        // 否则：使用自定义协议的Schema。
        else {
            createProtocol("app")
            await mainWindow.loadURL("app://./index.html")
        }
        mainWindow.setSize(800, 600); // 设置窗口大小。
        mainWindow.setMaximizable(true); // 允许最大化。
        mainWindow.setResizable(true); // 允许缩放。
        mainWindow.center();
    });

    ipcMain.on("window-minimize", async () => {
        mainWindow.minimize();
    });
    ipcMain.on("window-maximize", async () => {
        if (mainWindow.isMaximized()) {
            mainWindow.unmaximize();
        } else {
            mainWindow.maximize();
        }
    });
    ipcMain.on("window-close", async () => {
        mainWindow.close();
    });

    // 处理：注册快捷键。
    // 说明：当使用 Ctrl+Shift+I 或 Command+Shift+I 时，打开开发者工具。
    globalShortcut.register("CommandOrControl+Shift+i", () => {
        mainWindow.webContents.openDevTools();
    });
}

// 处理：所有窗口关闭时退出。
app.on("window-all-closed", () => {
    // 在 MacOS 上，应用程序及其菜单栏通常保持活动状态，直到用户使用 Command+Q 强制退出。
    // 因此当所有窗口关闭后，需要手动针对 MacOS 做退出处理。
    if (process.platform !== "darwin") {
        app.quit();
    }
})

// 处理：当应用程序激活时，如果没有其他窗口，则创建一个窗口。
app.on("activate", () => {
    // 在 MacOS 上，当点击 Dock 程序坞中的图标但没有其他窗口打开时，通常会在应用程序中重新创建一个窗口。
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
})

// 处理：应用程序准备就绪时，创建窗口。
// 备注：某些API只能在此事件发生后使用。
app.on("ready", async () => {
    await createWindow();
})

// 说明：如果是开发模式，则在父进程请求时清除退出。
if (isDevelopment) {
    // 如果是 Windows 平台。
    if (process.platform === "win32") {
        // 处理：当父进程请求时，清除退出。
        process.on("message", (data) => {
            // 如果是请求退出。
            if (data === "graceful-exit") {
                app.quit(); // 退出。
            }
        })
    }
    // 如果是其他平台。
    else {
        // 处理：当父进程请求时，清除退出。
        process.on("SIGTERM", () => {
            app.quit(); // 退出。
        })
    }
}
